using System;
using System.Collections.Generic;
using UnityEngine;

namespace Unity.Services.Analytics
{
    class TransactionCurrencyConverter
    {
        readonly Dictionary<string, int> m_Iso4217CurrencyMinorUnits = new Dictionary<string, int>(StringComparer.Ordinal)
        {
            { "AFN", 2 }, { "EUR", 2 }, { "ALL", 2 }, { "DZD", 2 }, { "USD", 2 }, { "AOA", 2 }, { "XCD", 2 }, { "ARS", 2 }, { "AMD", 2 },
            { "AWG", 2 }, { "AUD", 2 }, { "AZN", 2 }, { "BSD", 2 }, { "BHD", 3 }, { "BDT", 2 }, { "BBD", 2 }, { "BYN", 2 }, { "BZD", 2 },
            { "XOF", 0 }, { "BMD", 2 }, { "INR", 2 }, { "BTN", 2 }, { "BOB", 2 }, { "BOV", 2 }, { "BAM", 2 }, { "BWP", 2 }, { "NOK", 2 },
            { "BRL", 2 }, { "BND", 2 }, { "BGN", 2 }, { "BIF", 0 }, { "CVE", 2 }, { "KHR", 2 }, { "XAF", 0 }, { "CAD", 2 }, { "KYD", 2 },
            { "CLP", 0 }, { "CLF", 4 }, { "CNY", 2 }, { "COP", 2 }, { "COU", 2 }, { "KMF", 0 }, { "CDF", 2 }, { "NZD", 2 }, { "CRC", 2 },
            { "HRK", 2 }, { "CUP", 2 }, { "CUC", 2 }, { "ANG", 2 }, { "CZK", 2 }, { "DKK", 2 }, { "DJF", 0 }, { "DOP", 2 }, { "EGP", 2 },
            { "SVC", 2 }, { "ERN", 2 }, { "SZL", 2 }, { "ETB", 2 }, { "FKP", 2 }, { "FJD", 2 }, { "XPF", 0 }, { "GMD", 2 }, { "GEL", 2 },
            { "GHS", 2 }, { "GIP", 2 }, { "GTQ", 2 }, { "GBP", 2 }, { "GNF", 0 }, { "GYD", 2 }, { "HTG", 2 }, { "HNL", 2 }, { "HKD", 2 },
            { "HUF", 2 }, { "ISK", 0 }, { "IDR", 2 }, { "IRR", 2 }, { "IQD", 3 }, { "ILS", 2 }, { "JMD", 2 }, { "JPY", 0 }, { "JOD", 3 },
            { "KZT", 2 }, { "KES", 2 }, { "KPW", 2 }, { "KRW", 0 }, { "KWD", 3 }, { "KGS", 2 }, { "LAK", 2 }, { "LBP", 2 }, { "LSL", 2 },
            { "ZAR", 2 }, { "LRD", 2 }, { "LYD", 3 }, { "CHF", 2 }, { "MOP", 2 }, { "MKD", 2 }, { "MGA", 2 }, { "MWK", 2 }, { "MYR", 2 },
            { "MVR", 2 }, { "MRU", 2 }, { "MUR", 2 }, { "MXN", 2 }, { "MXV", 2 }, { "MDL", 2 }, { "MNT", 2 }, { "MAD", 2 }, { "MZN", 2 },
            { "MMK", 2 }, { "NAD", 2 }, { "NPR", 2 }, { "NIO", 2 }, { "NGN", 2 }, { "OMR", 3 }, { "PKR", 2 }, { "PAB", 2 }, { "PGK", 2 },
            { "PYG", 0 }, { "PEN", 2 }, { "PHP", 2 }, { "PLN", 2 }, { "QAR", 2 }, { "RON", 2 }, { "RUB", 2 }, { "RWF", 0 }, { "SHP", 2 },
            { "WST", 2 }, { "STN", 2 }, { "SAR", 2 }, { "RSD", 2 }, { "SCR", 2 }, { "SLL", 2 }, { "SGD", 2 }, { "SBD", 2 }, { "SOS", 2 },
            { "SSP", 2 }, { "LKR", 2 }, { "SDG", 2 }, { "SRD", 2 }, { "SEK", 2 }, { "CHE", 2 }, { "CHW", 2 }, { "SYP", 2 }, { "TWD", 2 },
            { "TJS", 2 }, { "TZS", 2 }, { "THB", 2 }, { "TOP", 2 }, { "TTD", 2 }, { "TND", 3 }, { "TRY", 2 }, { "TMT", 2 }, { "UGX", 0 },
            { "UAH", 2 }, { "AED", 2 }, { "USN", 2 }, { "UYU", 2 }, { "UYI", 0 }, { "UYW", 4 }, { "UZS", 2 }, { "VUV", 0 }, { "VES", 2 },
            { "VED", 2 }, { "VND", 0 }, { "YER", 2 }, { "ZMW", 2 }, { "ZWL", 2 }
        };

        public long Convert(string currencyCode, double value)
        {
            if (String.IsNullOrEmpty(currencyCode))
            {
                throw new ArgumentNullException(nameof(currencyCode), "Currency code cannot be null or empty.");
            }

            var currencyCodeUppercased = currencyCode.ToUpperInvariant();

            if (m_Iso4217CurrencyMinorUnits.TryGetValue(currencyCodeUppercased, out int numberOfMinorUnits))
            {
                return (long)(value * Math.Pow(10, numberOfMinorUnits));
            }
            else
            {
                Debug.LogWarning("Unknown currency provided to convert method, no conversion will be performed and returned value will be 0.");
                return 0;
            }
        }
    }
}
